// 哈希
var twoSum = function(nums, target) {
    const idx = new Map();
    for (let j = 0; j < nums.length; j++) {
        const x = nums[j];
        if (idx.has(target - x)) {
            return [idx.get(target - x), j];
        }
        idx.set(x, j);
    }
    return [];
}
console.log(twoSum([2, 7, 11, 15], 9));

var groupAnagrams = function(strs) {
    const map = new Map();
    for (const str of strs) {
        const key = str.split('').sort().join('');
        if (!map.has(key)) {
            map.set(key, []);
        }
        map.get(key).push(str);
    }
    return Array.from(map.values());
};
console.log(groupAnagrams(["eat", "tea", "tan", "ate", "nat", "bat"]));

var longestConsecutive = function(nums) {
    const numSet = new Set(nums);
    let longestStreak = 0;

    for (const num of numSet) {
        if (!numSet.has(num - 1)) {
            let currentNum = num;
            let currentStreak = 1;

            while (numSet.has(currentNum + 1)) {
                currentNum++;
                currentStreak++;
            }

            longestStreak = Math.max(longestStreak, currentStreak);
        }
    }

    return longestStreak;
}
console.log(longestConsecutive([100, 4, 200, 1, 3, 2]));

// 双指针

// 滑动窗口

// 子串&&子数组

// 普通数组
// 二维数组

// 回溯

// 栈
// 队列

// 堆
// 排序
// 二分
// 贪心
// 动态规划

// 技巧： 位运算 摩尔排序 

// 链表
// 二叉树
// 图